package edu.uclm.esi.tysweb.ajedrez.websockets;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.sql.SQLException;

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.WsOutbound;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

import edu.uclm.esi.tysweb.ajedrez.dominio.GestorAjedrez;
import edu.uclm.esi.tysweb.ajedrez.dominio.Jugador;
import edu.uclm.esi.tysweb.ajedrez.dominio.MensajeContrario;
import edu.uclm.esi.tysweb.ajedrez.dominio.MensajeError;
import edu.uclm.esi.tysweb.ajedrez.dominio.MensajeMovimiento;
import edu.uclm.esi.tysweb.ajedrez.dominio.MensajeNuevo;

public class Cliente extends MessageInbound {
	private WsOutbound outbound;
	private Jugador jugador;
	
	Cliente(Jugador jugador) {
		this.jugador=jugador;
	}

	@Override
	protected void onOpen(WsOutbound outbound) {
		this.outbound=outbound;
	}
	
	@Override
	protected void onBinaryMessage(ByteBuffer buffer) throws IOException {
	}

	@Override
	//Comunicacion entre clientes mediante WebSocket
	protected void onTextMessage(CharBuffer buffer) throws IOException {
		
		String msg=buffer.toString();
		MensajeError m;
		MensajeNuevo n;
		JSONObject jo=(JSONObject) JSONValue.parse(msg.toString());
		String tipo=jo.get("tipo").toString();
		
		//get("tipo") da el tipo de mensaje que es, en funcion de eso se ejecuta un bloque u otro
		
		if (tipo.equals("avisoDeLlegada")) { //Mensaje desde el Notificador
			enviar(jo.toJSONString()); //lo envia al js
			return;
		} 
		if (tipo.equals("reto")) {
			String retador=jo.get("emailRetador").toString();
			String retado=jo.get("emailRetado").toString();
			
			if (retador.equals(retado)) {
				m=new MensajeError("No puedes retarte a ti mismo");
				enviar(m.toJSON().toJSONString());
				return;
			}
			try {
				GestorAjedrez.get().retar(retador, retado);
			} catch (Exception e) {
				m=new MensajeError("Se ha producido un error: " + e.getMessage());
				enviar(m.toJSON().toJSONString());
				return;
			}
			return;
		} 
		if (tipo.equals("contestarReto")) {
			String retador=jo.get("emailRetador").toString();
			String retado=jo.get("emailRetado").toString();
			Boolean respuesta=(Boolean) jo.get("respuesta"); 
			try {
				GestorAjedrez.get().contestarReto(retado, retador, respuesta);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} //con esto informa al otro jugador
			return;
		}
		
		if (tipo.equals("rechazarReto")){
			enviar(jo.toJSONString());
			return;
		}
		
		if (tipo.equals("partida")){			
			enviar(jo.toJSONString());
			return;
		}
		
		if(tipo.equals("desconexion")){
			enviar(jo.toJSONString());
			return;
		}
		
		if(tipo.equals("movimiento")){
			int id=Integer.parseInt(jo.get("idtablero").toString());
			char color=jo.get("color").toString().charAt(0);
			String sOrigen=jo.get("sorigen").toString();
			String sDestino=jo.get("sdestino").toString();
			int nCaso=-1000;
			try {
				nCaso=GestorAjedrez.get().mover(id, color,sOrigen,sDestino);
				
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}				
			return;									
		}
		
		if(tipo.equals("movimientoContrario")){
			enviar(jo.toJSONString());
			return;
		}
		
		if(tipo.equals("tablas")){
			char color=jo.get("color").toString().charAt(0);
			int id=Integer.parseInt(jo.get("idTablero").toString());
			try {
				GestorAjedrez.get().proponerTablas(id, color);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			enviar(jo.toJSONString());
			return;
		}
		
		if (tipo.equals("contestarTablas")) {
			char color=jo.get("color").toString().charAt(0);
			int id=Integer.parseInt(jo.get("idTablero").toString());
			Boolean respuesta=(Boolean) jo.get("respuesta"); 
			try {
				GestorAjedrez.get().contestarTablas(id, color, respuesta);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} //con esto informa al otro jugador
			return;
		}
		
		if(tipo.equals("disponibles")){
			enviar(jo.toJSONString());
			return;
		}
		
		if(tipo.equals("abandonar")){
			char color=jo.get("color").toString().charAt(0);
			int id=Integer.parseInt(jo.get("idTablero").toString());
			try {
				GestorAjedrez.get().abandonar(id, color);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return;
		}
		
		m=new MensajeError("Has enviado un mensaje desconocido");
		enviar(m.toJSON().toJSONString());
	}
	
	//envia el mensaje al destino. Invoca el OnTextMensaje del cliente.java
	public void enviar(String msg) throws IOException {
		this.outbound.writeTextMessage(CharBuffer.wrap(msg)); //con esto invoca este cliente notificando al otro jugador
		this.outbound.flush();
	}
}